home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sun3src / machdep.h < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-19  |  7.2 KB  |  250 lines

  1.  
  2. /*    @(#)machdep.h 1.1 86/09/27 SMI    */
  3.  
  4. /*
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  */
  7.  
  8. /*
  9.  *    various handy constants for mapping and self-abuse 
  10.  */
  11. #define ADDRSIZE    (0x100000000)    /* 32-bit addresses */
  12. #define ADDRMASK    (ADDRSIZE - 1)
  13. #define SEGSIZE        (0x20000)    /* 128k segments*/
  14. #define SEGMASK        (SEGSIZE - 1)
  15. #define SEGSHIFT    (17)
  16. #define PAGESIZE    (0x2000)    /* 8k pages */
  17. #define PAGEMASK    (PAGESIZE -1)
  18. #define PAGESHIFT    (13)
  19. /*
  20.  *    handy macros
  21.  */
  22. #define BTOP(x)        ((u_long)(x)>>PAGESHIFT)    /* byte to page */
  23. #define PTOB(x)        ((u_long)(x)<<PAGESHIFT)    /* page to byte */
  24. #define GETPHYS(x)    ((PTOB(getpgreg(x))& ADDRMASK)+((u_long)(x)&PAGEMASK))
  25. #define ISVALID(x)    ((getpgreg(x) & (u_long)0x80000000) == 0x80000000)
  26. /*
  27.  *    for parity(gen,check)  mnemonics
  28.  */
  29. #define PAR_GEN        (1)    /* like in parity(PAR_GEN or ! PAR_GEN */
  30. #define PAR_CHECK    (1)    /* ditto */
  31. /*
  32.  *    offsets into fc3 accesses
  33.  */
  34. #define ID_OFF        (0x0)        /* id prom */
  35. #define PG_OFF        (0x10000000)    /* page map offset in fc3 space */
  36. #define SM_OFF        (0x20000000)    /* segment map */
  37. #define CX_OFF        (0x30000000)    /* context registers */
  38. #define ENABLE_OFF    (0x40000000)    /* system enable register */
  39. #define UDVMA_OFF    (0x50000000)    /* user dvma enable */
  40. #define BERR_OFF    (0x60000000)    /* buserror register */
  41. #define LED_OFF        (0x70000000)    /* led (diagnostic register) */
  42. /*
  43.  *    physical addresses of devices
  44.  */
  45. #define pa_kbm        (0x00000000)    /* keyboard mouse scc */
  46. #define pa_scc        (0x00020000)    /* scc */
  47. #define pa_eeprom    (0x00040000)    /* eeprom */
  48. #define pa_clock    (0x00060000)
  49. #define pa_parity    (0x00080000)
  50. #define pa_interrupt    (0x000a0000)
  51. #define pa_ethernet    (0x000c0000)
  52. #define pa_color    (0x000e0000)
  53. #define pa_eprom    (0x00100000)
  54. /*
  55.  *    assembly setups (for internal use)
  56.  *        users should use get/set/fc3()
  57.  */
  58. #define    MOVC(from, to)    asm("    movc    from, to")
  59. #define    MOVL(from, to)    asm("    movl    from, to")
  60. #define MOVSB(from, to)    asm("    movsb    from, to")
  61. #define MOVSW(from, to)    asm("    movsw    from, to")
  62. #define MOVSL(from, to)    asm("    movsl    from, to")
  63. /*
  64.  *    permissions available
  65.  */
  66. #define PMP_ALL        (3)    /* real loose - valid, write, supervisor */
  67.  
  68. /*
  69.  *    memory spaces available
  70.  */
  71. enum pm_type {        /* possible address spaces on board */
  72.     PM_MEM        = 0,        /* on-board memory */
  73.     PM_IO        = 1,        /* on-board I/O */
  74.     PM_16VME    = 2,        /* 16bit bus memory (MB or VME) */
  75.     PM_32VME    = 3        /* 32bit bus memory (MB or VME) */
  76. };
  77. /*
  78.  *        These are the layouts of various MMU registers in
  79.  *    both whole entry layout, and bitfield definitions.  To use,
  80.  *    pass and return ??_reg.??_whole, and to play with afterwards,
  81.  *    use ??_reg.??_field.??_whatever.
  82.  *        The machdep.c routines are defined with ??_size
  83.  *    usage (in and ??out)
  84.  *
  85.  *            WARNING WARNING
  86.  *
  87.  *     DO NOT ATTEMPT TO PASS OR RETURN THE STRUCTS, the compiler
  88.  *    has bugs on things which are not long aligned.
  89.  */
  90. typedef u_char    cx_size;
  91. typedef u_char    sm_size;
  92. typedef u_long    pg_size;
  93.  
  94. union cx_reg {
  95.     cx_size    cx_whole;        /* supv and user contexts */
  96.     struct cx_field {
  97.         unsigned        :4;
  98.         unsigned        :1;
  99.         unsigned    context    :3;    /* context [0..7] */
  100.     } cx_field;
  101. };
  102.  
  103. union sm_reg {
  104.     sm_size    sm_whole;        /* segment entry */
  105.     struct sm_field {
  106.         u_char        sm_pmeg;    /* pmeg group */
  107.     } sm_field;
  108. };
  109.  
  110. union pg_reg {
  111.     pg_size    pg_whole;        /* page map entry */
  112.     struct pg_field{
  113.         unsigned    pg_valid:1;        /* valid bit */
  114.         unsigned    pg_permission:2;    /* write/sup */
  115.         unsigned    pg_cache:1;        /* cache */
  116.         enum pm_type    pg_space:2;        /* address space */
  117.         unsigned    pg_accessed:1;        /* page accessed?? */
  118.         unsigned    pg_modified:1;        /* page modified?? */
  119.         unsigned    :5;
  120.         unsigned    pg_pagenum:19;        /* page number */
  121.     } pg_field;
  122. };
  123. /*
  124.  *    some handy typedefs
  125.  */
  126. typedef union cx_reg    cx_t;
  127. typedef union sm_reg    sm_t;
  128. typedef union pg_reg    pg_t;
  129. /*
  130.  *    the similar definitions of things in fc3 space that are not
  131.  *    MMU related, same caveats apply as above
  132.  */
  133. typedef u_char    id_size, led_size;
  134. typedef u_char    berr_size, enable_size, interrupt_size, parity_size;
  135.  
  136. union id_reg {
  137.     id_size    id_whole;    /* id prom */
  138.     struct id_field {
  139.         u_char    id_byte;
  140.     } id_field;
  141. };
  142. /*
  143.  * the setledreg routine will invert the given led pattern,
  144.  * because 0=lit, so passed lit=1
  145.  */
  146. union led_reg {
  147.     led_size    led_whole;    /* led (diagnostic) register */
  148.     struct led_field {
  149.         unsigned    led_d7    :1;    /* individual bits inverted */
  150.         unsigned    led_d6    :1;
  151.         unsigned    led_d5    :1;
  152.         unsigned    led_d4    :1;
  153.         unsigned    led_d3    :1;
  154.         unsigned    led_d2    :1;
  155.         unsigned    led_d1    :1;
  156.         unsigned    led_d0    :1;
  157.     } led_field;
  158. };
  159.  
  160. union berr_reg {
  161.     berr_size    berr_whole;    /* bus error register */
  162.     struct berr_field {
  163.         unsigned    berr_invalidpg    :1;
  164.         unsigned    berr_proterr    :1;    /* protection error */
  165.         unsigned    berr_timeout    :1;    /* timeout error */
  166.         unsigned    berr_vmebuserr    :1;    /* p1 bus master */
  167.         unsigned            :4;    /* reserved */
  168.     } berr_field;
  169. };
  170.  
  171. union enable_reg {
  172.     enable_size    enable_whole;    /* system enable register */
  173.     struct enable_field {
  174.         unsigned    enable_diag    :1;    /* diag switch */
  175.         unsigned            :1;    /* reserved */
  176.         unsigned    enable_vcopy    :1;    /* copy mode video fb */
  177.         unsigned    enable_video    :1;    /* video display */
  178.         unsigned    enable_cache    :1;    /* external cache */
  179.         unsigned    enable_dvma    :1;    /* system dvma */
  180.         unsigned    enable_fpp    :1;    /* floating point */
  181.         unsigned    enable_normal    :1;    /* 0 = bootstate */
  182.     } enable_field;
  183. };
  184.  
  185. union interrupt_reg {
  186.     interrupt_size    interrupt_whole;    /* interrupt register */
  187.     struct interrupt_field {
  188.         unsigned    enable_todint7    :1;    /* int 7 (nmi,tod) */
  189.         unsigned            :1;    /* reserved */
  190.         unsigned    enable_todint5    :1;    /* int 5 (tod) */
  191.         unsigned    enable_vidint4    :1;    /* int 4 video */
  192.         unsigned    enable_swint3    :1;    /* int 3 sw */
  193.         unsigned    enable_swint2    :1;    /* int 2 sw */
  194.         unsigned    enable_swint1    :1;    /* int 1 sw */
  195.         unsigned    enable_ints    :1;    /* enable all ints */
  196.     } interrupt_field;
  197. };
  198.  
  199. union parity_reg {
  200.     parity_size    parity_whole;    /* parity register */
  201.     struct parity_field {
  202.         unsigned    par_int        :1;    /* */
  203.         unsigned    par_int_ena    :1;    /* */
  204.         unsigned    par_gen        :1;    /* */
  205.         unsigned    par_check    :1;    /* */
  206.         unsigned    parerr24    :1;    /* */
  207.         unsigned    parerr16    :1;    /* */
  208.         unsigned    parerr08    :1;    /* */
  209.         unsigned    parerr00    :1;    /* */
  210.     } parity_field;
  211. };
  212.  
  213. /*
  214.  *    more less handy typedefs
  215.  */
  216.  
  217. typedef    union id_reg        id_t;
  218. typedef    union led_reg        led_t;
  219. typedef    union berr_reg        berr_t;
  220. typedef    union enable_reg    enable_t;
  221.  
  222. /*
  223.  *    definition of the exception vector table
  224.  *    accessed with ex_vector->?????
  225.  */
  226. struct mc68k_vector {
  227.     char    *e_initsp;    /* 0  initial stack pointer */
  228.     int    (*e_initpc)();    /* 1  initial program counter */
  229.     int    (*e_buserr)();    /* 2  buserror */
  230.     int    (*e_addrerr)();    /* 3  address error */
  231.     int    (*e_illinst)();    /* 4  illegal instruction */
  232.     int    (*e_zerodiv)();    /* 5  divide by zero */
  233.     int    (*e_chk)();    /* 6  CHK instruction */
  234.     int    (*e_trapv)();    /* 7  TRAPV instruction */
  235.     int    (*e_priv)();    /* 8  privilege violation */
  236.     int    (*e_trace)();    /* 9  trace */
  237.     int    (*e_line10)();    /* 10 line 1010 emulator */
  238.     int    (*e_line15)();    /* 11 line 1111 emulator */
  239.     int    (*e_res0[2])();    /* 12-13 reserved by Motorola */
  240.     int    (*e_format)();    /* 14 format error */
  241.     int    (*e_uninit)();    /* 15 uninitialized interrupt vector */
  242.     int    (*e_res1[8])();    /* 16-23 reserved blah blah */
  243.     int    (*e_int[8])();    /* 24 is spurious, 25-31 are auto level 1-7*/
  244.     int    (*e_trap[16])();    /* 32-47 are trap#n vectors */
  245.     int    (*e_res2[16])();    /* 48-63 are reserved */
  246.     int    (*e_user[192])();    /* 64-255 are user int vectors */
  247. };
  248. #define spurious    e_int[0]
  249. #define    ex_vector    ((struct mc68k_vector *)0)
  250.